﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Schema;
using System.IO;

namespace GenIX
{
    public partial class EditXmlForm : Form
    {
        // <BaseMetods>
        // ======================= Базовые методы ===================================
        //</BaseMetods>

        // <ParsingXml>
        // Парсинг (синтаксический анализ) файла XML и построение интерфейса
        // </ParsingXml>
        public void Parsing()
        {
            XmlTextReader reader = null;
            MainForm Frm1 = this.Owner as MainForm;

            try
            {
                reader = new XmlTextReader(Frm1.filename);
                reader.WhitespaceHandling = WhitespaceHandling.None;

                xmlRichTextBox.Clear();

                // <CheckNode> Проверка типа узла и отображение следующего </CheckNode>
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                        case XmlNodeType.Document:
                            break;

                        case XmlNodeType.XmlDeclaration:
                            xmlRichTextBox.AppendText("<?xml version='1.0' encoding='UTF-8'?>" + Environment.NewLine);
                            break;

                        case XmlNodeType.DocumentType:
                            xmlRichTextBox.AppendText("<!DOCTYPE " + reader.Name + " SYSTEM 'ROWS.dtd'>" + Environment.NewLine);
                            break;

                        case XmlNodeType.Comment:
                            xmlRichTextBox.AppendText(Environment.NewLine + "<!--" + reader.Value + "-->" + Environment.NewLine);
                            break;

                        case XmlNodeType.Element:
                            if (reader.Name == "ROWS")
                                xmlRichTextBox.AppendText(Environment.NewLine + "<" + reader.Name + ">");
                            else if (reader.Name == "ROW")
                                xmlRichTextBox.AppendText(Environment.NewLine + "\t <" + reader.Name + ">");
                            else
                                xmlRichTextBox.AppendText(Environment.NewLine + "\t\t <" + reader.Name + ">");
                            break;

                        case XmlNodeType.Text:
                            xmlRichTextBox.AppendText(reader.Value);
                            break;

                        case XmlNodeType.EndElement:
                            if (reader.Name == "ROWS")
                                xmlRichTextBox.AppendText(Environment.NewLine + "</" + reader.Name + ">");
                            else if (reader.Name == "ROW")
                                xmlRichTextBox.AppendText(Environment.NewLine + "\t </" + reader.Name + ">");
                            else
                                xmlRichTextBox.AppendText("</" + reader.Name + ">");
                            break;

                    }
                }
            }

            // <XmlException> Перехват сообщения об исключениях XML </XmlException>
            catch (XmlException e)
            {
                MessageBox.Show(e.Message, "Ошибка корректности файла XML", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // <NullReferenceException> Перехват сообщения об исключениях отсутствия указателя на объект </NullReferenceException>
            catch (NullReferenceException e)
            {
                MessageBox.Show(e.Message, "Объект не найден", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // <FileNotFoundException> Перехват сообщения об исключениях отсутствия файла </FileNotFoundException>
            catch (System.IO.FileNotFoundException e)
            {
                MessageBox.Show(e.Message, "Файл DTD схемы не найден", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            finally
            {
                if (reader != null)
                    reader.Close();
            }
        }

        // <Colors>
        // Подсветка определенного куска текста
        // </Colors>
        public void Colors(string mystring, System.Drawing.Color col)
        {
            if (xmlRichTextBox.Find(mystring) > 0)
            {
                int my1stPosition = xmlRichTextBox.Find(mystring);
                xmlRichTextBox.SelectionStart = my1stPosition;
                xmlRichTextBox.SelectionLength = mystring.Length;
            }
            xmlRichTextBox.SelectionColor = col;
        }

        // <Highlight>
        // Подсветка файла XML
        // </Highlight>
        public void Highlight()
        {
            XmlTextReader reader = null;
            MainForm Frm1 = this.Owner as MainForm;

            try
            {
                reader = new XmlTextReader(Frm1.filename);
                reader.WhitespaceHandling = WhitespaceHandling.None;

                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {

                        case XmlNodeType.Document:
                            break;

                        case XmlNodeType.XmlDeclaration:
                            Colors("<?xml version='1.0' encoding='UTF-8'?>", Color.Red);
                            break;

                        case XmlNodeType.DocumentType:
                            Colors("<!DOCTYPE " + reader.Name + " [" + reader.Value + "]>", Color.Black);
                            break;

                        case XmlNodeType.Comment:
                            Colors("<!--" + reader.Value + "-->", Color.Green);
                            break;

                        case XmlNodeType.Element:
                            Colors("<" + reader.Name + ">", Color.Blue);
                            break;

                        case XmlNodeType.Text:
                            Colors(reader.Value, Color.Black);
                            break;

                        case XmlNodeType.EndElement:
                            Colors("</" + reader.Name + ">", Color.Blue);
                            break;

                    }
                }
            }

            finally
            {
                if (reader != null)
                    reader.Close();
            }
        }

    }
}